package com.fulu.javabase.threadpool;


import java.lang.ref.WeakReference;

public class ThreadLocalTest {
    public static void main(String[] args) {
        Thread t1 = new Thread(Nor::testt);
        t1.start();
    }

    static class Nor{

        public static void testt(){
            ThreadLocal<Object> tl = new ThreadLocal<>();
            tl.set("aaa");
            System.out.println(Thread.currentThread().getName() + tl.get());
            // 在线程执行完之前调用remove方法，防止内存泄漏
            tl.remove();
        }
    }

    /**
     * 这个方法解释了为什么ThreadLocalMap的Key要使用弱引用
     * 当这个线程创建了一个ThreadLocal对象后，则对这个对象产生一个强引用
     * 当使用ThreadLocal对象为Key保存值的时候又产生一次引用
     * 这第二次引用如果是强引用，那么ThreadLocal对象引用设置为null
     * map中还有一个引用，那么ThreadLocal对象不会被回收，时间久了会造成内存溢出
     * 所以，如果是弱引用，map中的key也就会变成null，
     * 之后ThreadLocal会在set get时检查并清除key为null的数据。
     */
    private static void testWeakReference() {
        Object o1 = new Object();
        Entity entity = new Entity(o1, "aaa");
        System.out.println(entity.get());
        o1 = null;
        System.gc();
        System.out.println(entity.get());
    }
}

/**
 * 模拟threadLocal中的table数组项
 */
class Entity extends WeakReference<Object>{
    Object value;

    public Entity(Object referent, Object value) {
        super(referent);
        this.value = value;
    }
}
